Техника защиты компакт-дисков от копирования

         

Финал[Y81] [n2k82]


В листинге 2.25Ниже приведен законченный примерм использования корректирующих кодов на практике, пригодный для решения реальных практических задач.

Листинг 21.25. Пример вызова функций библиотеки ElByECC.DLL из своей программы

/*----------------------------------------------------------------------------

 *

 *                демонстрация ElByECC.DLL

 *                ========================

 *

 *    данная программа  демонстрирует  работу  с  библиотекой  ElByECC.DLL,

 * генерируя избыточные коды Рида-Соломона на основе пользовательских данных,

 * затем умышленно искажает их и вновь  восстанавливает.

 *    количество разрушаемых байтов передается в первом параметре командной

 * строки (по умолчанию - 6)

----------------------------------------------------------------------------*/

#include <stdio.h>

#include "ElByECC.h"                           // декомпилировано МЫЩЪХем

#define _DEF_DMG    6                          // рушить по умолчанию



#define N_BYTES_DAMAGE    ((argc>1)?atol(argv[1]):_DEF_DMG)    // сколько байт

                                                               // рушить?

main(int argc, char **argv)

{

    int a;

    char stub_head[HEADER_SIZE];               // заголовок сектора

    char user_data[USER_DATA_SIZE];            // область польз. данных

   

    struct RAW_SECTOR_MODE1 raw_sector_for_damage;       // сектор для искажений

    struct RAW_SECTOR_MODE1 raw_sector_for_compre;       // контрольная копия сект.

   

    // TITLE

    //------------------------------------------------------------------------

    printf("= ElByECC.DLL usage demo example by KK\n");

   

    // инициализация пользовательских данных

    //------------------------------------------------------------------------

    printf("user data initialize...............");

    for (a = 0; a < USER_DATA_SIZE; a++) user_data[a] = a;   // user_data  init

    memset(stub_head, 0, HEADER_SIZE); stub_head[3] = 1;     // src header init


    printf("+OK\n");

   

    // генерация кодов Рида- Соломона на основе пользовательских данных

    //-----------------------------------------------------------------------

    printf("RS-code generate...................");

    a = GenECCAndEDC_Mode1(user_data, stub_head, &raw_sector_for_damage);

    if (a == ElBy_SECTOR_ERROR) { printf("-ERROR!\x7\n"); return -1;}

    memcpy(&raw_sector_for_compre, &raw_sector_for_damage, RAW_SECTOR_SIZE);

    printf("+OK\n");

   

    // умышленное искажение пользовательских данных

    //------------------------------------------------------------------------

    printf("user-data %04d bytes damage........", N_BYTES_DAMAGE);

    for (a=0;a<N_BYTES_DAMAGE;a++) raw_sector_for_damage.USER_DATA[a]^=0xFF;

    if(!memcmp(&raw_sector_for_damage,&raw_sector_for_compre,RAW_SECTOR_SIZE))

         printf("-ERR: NOT DAMAGE YET\n"); else printf("+OK\n");

   

    // проверка целостности пользовательских данных

    //------------------------------------------------------------------------

    printf("user-data check....................");

    a = CheckSector((struct RAW_SECTOR*)&raw_sector_for_damage,ElBy_TEST_ONLY);

    if (a==ElBy_SECTOR_OK){

         printf("-ERR:data not damage\x7\n");return -1;}printf(".data damge\n");

   

    // восстановление пользовательских данных

    //------------------------------------------------------------------------

    printf("user-data recorver.................");

    a = CheckSector((struct RAW_SECTOR*)&raw_sector_for_damage, ElBy_REPAIR);

    if (a == ElBy_SECTOR_ERROR) {

         printf("-ERR: NOT RECORVER YET\x7\n"); return -1; } printf("+OK\n");

   

    // проверка успешности восстановления

    //------------------------------------------------------------------------

    printf("user-data recorver check...........");

    if(memcmp(&raw_sector_for_damage,&raw_sector_for_compre,RAW_SECTOR_SIZE))

         printf("-ERR: NOT RECORVER YET\x7\n"); else printf("+OK\n");

   

    printf("+OK\n");

    return 1;

}


Содержание раздела